package com.qianjiangcloud.store.util;

import android.content.Context;
import android.os.AsyncTask;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import com.qianjiangcloud.store.libary.cache.FileSystem.FileSystem;

/**
 * Created by caojian on 16/6/28.
 */

//下载压缩文件
public class DownLoadZip  extends AsyncTask<Void, Integer, Long> {
    private final String TAG = "DownLoaderTask";
    private URL mUrl;
    private File mFile;
    private int mProgress = 0;
    private ProgressReportingOutputStream mOutputStream;
    private Context mContext;
    private ZipExtractorTask.FileToString fileToString;
    public DownLoadZip(String url, String out, Context context, ZipExtractorTask.FileToString fileToString){
        super();
        this.fileToString=fileToString;
        mContext = context;
        try {
            mUrl = new URL(url);
//            String fileName = new File(mUrl.getFile()).getName();
            mFile = new File(out,"all.zip");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
//        super.onPreExecute();
//        if(mDialog!=null){
//            mDialog.setTitle("Downloading...");
//           // mDialog.setMessage(mFile.getName());
//            mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//            mDialog.show();
//        }
    }

    @Override
    protected Long doInBackground(Void... params) {
        // TODO Auto-generated method stub
        return download();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        //super.onProgressUpdate(values);
//        if(mDialog==null)
//            return;
//        if(values.length>1){
//            int contentLength = values[1];
//            if(contentLength==-1){
//                mDialog.setIndeterminate(true);
//            }
//            else{
//                mDialog.setMax(contentLength);
//            }
//        }
//        else{
//            mDialog.setProgress(values[0].intValue());
//        }
    }

    @Override
    protected void onPostExecute(Long result) {
        // TODO Auto-generated method stub
            File zip = new File(FileSystem.getCachesDir(mContext, true) + File.separator + "all.zip");
            if (!zip.exists())
                return;
            ZipExtractorTask task = new ZipExtractorTask(zip.getAbsolutePath(), FileSystem.getCachesDir(mContext, true).getAbsolutePath(),mContext, true,fileToString);
            task.execute();
    }

    private long download(){
        URLConnection connection = null;
        int bytesCopied = 0;
        try {
            connection = mUrl.openConnection();
            int length = connection.getContentLength();
//            if(mFile.exists()&&length == mFile.length()){
//                return 0l;
//            }
            mOutputStream = new ProgressReportingOutputStream(mFile);
            publishProgress(0,length);
            bytesCopied =copy(connection.getInputStream(),mOutputStream);
            if(bytesCopied!=length&&length!=-1){
            }
            mOutputStream.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return bytesCopied;
    }
    private int copy(InputStream input, OutputStream output){
        byte[] buffer = new byte[1024*8];
        BufferedInputStream in = new BufferedInputStream(input, 1024*8);
        BufferedOutputStream out  = new BufferedOutputStream(output, 1024*8);
        int count =0,n=0;
        try {
            while((n=in.read(buffer, 0, 1024*8))!=-1){
                out.write(buffer, 0, n);
                count+=n;
            }
            out.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return count;
    }
    private final class ProgressReportingOutputStream extends FileOutputStream {

        public ProgressReportingOutputStream(File file)
                throws FileNotFoundException {
            super(file);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void write(byte[] buffer, int byteOffset, int byteCount)
                throws IOException {
            // TODO Auto-generated method stub
            super.write(buffer, byteOffset, byteCount);
            mProgress += byteCount;
            publishProgress(mProgress);
        }

    }
}
